#include <iostream>
#include <stdio.h>

/*
 * 处于堆栈中的对象的构造函数与析构函数		P156
 */

class Base
{
	public:
		Base (void);
		void demo(void);
		~Base(void);
};

Base::Base()
{
	printf("Constructor.\n");
}

Base::~Base()
{
	printf("Destructor.\n");
}

void Base::demo(void)
{
	printf("Base.\n");
}


int main()
{
	Base p;
	
	p.demo();
}

/*
	Constructor.
	Base.
	Destructor.
 */

 #if 0
/*
 * intel
 */
00000000000011ca <_ZN4BaseC1Ev>:
    11ca:	f3 0f 1e fa          	endbr64 
    11ce:	55                   	push   %rbp
    11cf:	48 89 e5             	mov    %rsp,%rbp
    11d2:	48 83 ec 10          	sub    $0x10,%rsp
    11d6:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)	// rbp-0x8=rdi
    11da:	48 8d 3d 24 0e 00 00 	lea    0xe24(%rip),%rdi        # 2005 <_ZStL19piecewise_construct+0x1>
    11e1:	e8 da fe ff ff       	callq  10c0 <puts@plt>
    11e6:	90                   	nop
    11e7:	c9                   	leaveq 
    11e8:	c3                   	retq   
    11e9:	90                   	nop

00000000000011ea <_ZN4BaseD1Ev>:
    11ea:	f3 0f 1e fa          	endbr64 
    11ee:	55                   	push   %rbp
    11ef:	48 89 e5             	mov    %rsp,%rbp
    11f2:	48 83 ec 10          	sub    $0x10,%rsp
    11f6:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)
    11fa:	48 8d 3d 11 0e 00 00 	lea    0xe11(%rip),%rdi        # 2012 <_ZStL19piecewise_construct+0xe>
    1201:	e8 ba fe ff ff       	callq  10c0 <puts@plt>
    1206:	90                   	nop
    1207:	c9                   	leaveq 
    1208:	c3                   	retq   
    1209:	90                   	nop

000000000000120a <_ZN4Base4demoEv>:
    120a:	f3 0f 1e fa          	endbr64 
    120e:	55                   	push   %rbp
    120f:	48 89 e5             	mov    %rsp,%rbp
    1212:	48 83 ec 10          	sub    $0x10,%rsp
    1216:	48 89 7d f8          	mov    %rdi,-0x8(%rbp)
    121a:	48 8d 3d fd 0d 00 00 	lea    0xdfd(%rip),%rdi        # 201e <_ZStL19piecewise_construct+0x1a>
    1221:	e8 9a fe ff ff       	callq  10c0 <puts@plt>
    1226:	90                   	nop
    1227:	c9                   	leaveq 
    1228:	c3                   	retq   

0000000000001229 <main>:
    1229:	f3 0f 1e fa          	endbr64 
    122d:	55                   	push   %rbp
    122e:	48 89 e5             	mov    %rsp,%rbp
    1231:	53                   	push   %rbx
    1232:	48 83 ec 18          	sub    $0x18,%rsp		// rsp-=0x18
    1236:	64 48 8b 04 25 28 00 	mov    %fs:0x28,%rax		// rax=fs:0x28
    123d:	00 00 
    123f:	48 89 45 e8          	mov    %rax,-0x18(%rbp)		// rbp-x018=rax
    1243:	31 c0                	xor    %eax,%eax		// eax=0
    1245:	48 8d 45 e7          	lea    -0x19(%rbp),%rax		// rax=rbp-0x19
    1249:	48 89 c7             	mov    %rax,%rdi		// rdi=rax
    124c:	e8 79 ff ff ff       	callq  11ca <_ZN4BaseC1Ev>	// Base(rdi)
    1251:	48 8d 45 e7          	lea    -0x19(%rbp),%rax		// rax=rbp-0x19
    1255:	48 89 c7             	mov    %rax,%rdi		// rdi=rax
    1258:	e8 ad ff ff ff       	callq  120a <_ZN4Base4demoEv>	// base.demo(rdi)
    125d:	48 8d 45 e7          	lea    -0x19(%rbp),%rax		// rax=rbp-x019
    1261:	48 89 c7             	mov    %rax,%rdi		// rdi=rax
    1264:	e8 81 ff ff ff       	callq  11ea <_ZN4BaseD1Ev>	// ~Base(rdi)
    1269:	b8 00 00 00 00       	mov    $0x0,%eax		// eax=0
    126e:	48 8b 55 e8          	mov    -0x18(%rbp),%rdx		// rdx=rbp-0x18
    1272:	64 48 33 14 25 28 00 	xor    %fs:0x28,%rdx		// fs:0x28 ^ rdx
    1279:	00 00 
    127b:	74 25                	je     12a2 <main+0x79>		// ==
    127d:	eb 1e                	jmp    129d <main+0x74>		// jmp
    127f:	f3 0f 1e fa          	endbr64 
    1283:	48 89 c3             	mov    %rax,%rbx		// rbx=rax
    1286:	48 8d 45 e7          	lea    -0x19(%rbp),%rax		// rax=rbp-0x19
    128a:	48 89 c7             	mov    %rax,%rdi		// rdi=rax
    128d:	e8 58 ff ff ff       	callq  11ea <_ZN4BaseD1Ev>	// ~Base(rdi)
    1292:	48 89 d8             	mov    %rbx,%rax		// rax=rbx
    1295:	48 89 c7             	mov    %rax,%rdi		// rdi=rax
    1298:	e8 33 fe ff ff       	callq  10d0 <_Unwind_Resume@plt>
    129d:	e8 fe fd ff ff       	callq  10a0 <__stack_chk_fail@plt>	// jmp
    12a2:	48 83 c4 18          	add    $0x18,%rsp		// ==
    12a6:	5b                   	pop    %rbx
    12a7:	5d                   	pop    %rbp
    12a8:	c3                   	retq   

/*
 * arm
 */
000000000040085c <_ZN4BaseC1Ev>:
  40085c:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  400860:	910003fd 	mov	x29, sp
  400864:	f9000fa0 	str	x0, [x29, #24]
  400868:	90000000 	adrp	x0, 400000 <_init-0x698>
  40086c:	91292000 	add	x0, x0, #0xa48
  400870:	97ffffb0 	bl	400730 <puts@plt>
  400874:	d503201f 	nop
  400878:	a8c27bfd 	ldp	x29, x30, [sp], #32
  40087c:	d65f03c0 	ret

0000000000400880 <_ZN4BaseD1Ev>:
  400880:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  400884:	910003fd 	mov	x29, sp
  400888:	f9000fa0 	str	x0, [x29, #24]
  40088c:	90000000 	adrp	x0, 400000 <_init-0x698>
  400890:	91296000 	add	x0, x0, #0xa58
  400894:	97ffffa7 	bl	400730 <puts@plt>
  400898:	d503201f 	nop
  40089c:	a8c27bfd 	ldp	x29, x30, [sp], #32
  4008a0:	d65f03c0 	ret

00000000004008a4 <_ZN4Base4demoEv>:
  4008a4:	a9be7bfd 	stp	x29, x30, [sp, #-32]!
  4008a8:	910003fd 	mov	x29, sp
  4008ac:	f9000fa0 	str	x0, [x29, #24]
  4008b0:	90000000 	adrp	x0, 400000 <_init-0x698>
  4008b4:	9129a000 	add	x0, x0, #0xa68
  4008b8:	97ffff9e 	bl	400730 <puts@plt>
  4008bc:	d503201f 	nop
  4008c0:	a8c27bfd 	ldp	x29, x30, [sp], #32
  4008c4:	d65f03c0 	ret

00000000004008c8 <main>:
  4008c8:	a9bd7bfd 	stp	x29, x30, [sp, #-48]!
  4008cc:	910003fd 	mov	x29, sp
  4008d0:	f9000bf3 	str	x19, [sp, #16]			// sp+16=x19
  4008d4:	9100a3a0 	add	x0, x29, #0x28			// x0=x29+0x28
  4008d8:	97ffffe1 	bl	40085c <_ZN4BaseC1Ev>		// Base(x0)
  4008dc:	9100a3a0 	add	x0, x29, #0x28			// x0=x29+0x28
  4008e0:	97fffff1 	bl	4008a4 <_ZN4Base4demoEv>	// base.demo(x0)
  4008e4:	9100a3a0 	add	x0, x29, #0x28			// x0=x29+x28
  4008e8:	97ffffe6 	bl	400880 <_ZN4BaseD1Ev>		// ~Base(x0)
  4008ec:	52800000 	mov	w0, #0x0                   	// #0
  4008f0:	14000006 	b	400908 <main+0x40>		// 
  4008f4:	aa0003f3 	mov	x19, x0				// x19=x0
  4008f8:	9100a3a0 	add	x0, x29, #0x28			// x0=x29+x028
  4008fc:	97ffffe1 	bl	400880 <_ZN4BaseD1Ev>		// ~Base(x0)
  400900:	aa1303e0 	mov	x0, x19				// x0=x19
  400904:	97ffff93 	bl	400750 <_Unwind_Resume@plt>
  400908:	f9400bf3 	ldr	x19, [sp, #16]
  40090c:	a8c37bfd 	ldp	x29, x30, [sp], #48
  400910:	d65f03c0 	ret

 #endif
